20180421 從YYLS批次下載海賊王902話
目前已經學完用request取得網頁,
並用BS和正則表達式來剖析取得的網頁原始碼,
最新我們還學習了用request下載檔案。
現在做個簡單的爬蟲並下載的練習,
海賊王902話已經出刊拉,我們挑個有在刊連載的漫畫網站來試試看吧!
#導入模組
from bs4 import BeautifulSoup
import requests
import re
#將網頁用request取得包給bs
url="http://8comic.se/158851/"
html = requests.get(url).text
soup = BeautifulSoup(html,"lxml")
#將原始碼用bs剖析所需要的資料
#符合條件為下:
#類別為img /class=alignnone /src = .jpg為結尾。
img_url = soup.find_all("img",{"class":"alignnone",'src':re.compile('.*?\.jpg')})
#把連結從list轉換成string並給到命名為img_src的value
#把連結的文字長度取出來 (之後做迴圈會用到)
img_src = img_url[0]['src']
url_len = len(img_src)
#查看原始碼時發現,每頁圖片只有最後數字命名不同。
#我們直接簡單做30次迴圈
for i in range(1,30):
#將連結的最後的字串用i取代掉 (取到連結長度的後4+len(i)碼)
#將下載位置儲存在"download\"之下,命名為將連結字串以"/"split出來的最後一項 (範例為001.jpg,002.jpg....)
link = img_src[0:url_len-4-len(str(i))]+str(i)+".jpg"
file_path = "Downloads\\"+link.split('/')[-1]
#用stream(32bytes)方式連續下載
r = requests.get(url, stream=True)
with open(file_path, "wb") as code:
for chunk in r.iter_content(chunk_size=32):
code.write(chunk)
print('Saved %s' % file_path)
此方式很笨,原因在不知道總共有幾頁,
比如說迴圈30次,結果只有20頁則會下載到一些空白頁面。
反之則會下載不足。
此因為網頁內涵javascript要用更複雜的方式處理。
不過哥哥接下來就會開始示範拉。
** 0422發現原始碼裡其實有總頁數,不需要用到js裡的資料,改版如下:
from bs4 import BeautifulSoup
import requests
import re
url="http://8comic.se/13208/"
html = requests.get(url).text
soup = BeautifulSoup(html,"lxml")
img_url = soup.find_all("img",{"class":"alignnone",'src':re.compile('.*?\.jpg')})
img_src = img_url[0]['src']
url_len = len(img_url[0]['src'])
#用bs這已找到a類別,id=infotxtb這個屬性裡有包含總頁數的文字,結果會像這樣:第001頁/共111頁
#用正則表達只將共幾頁取出來,餵給re.compile之後使用
total_page = soup.find_all('a',{'id':'infotxtb'})
number = re.compile(r"/*[1]\d+")
last_page = re.search(number, total_page[-1].text).group()
#將原本迴圈30次,修改為所抓到的總頁數
for i in range(1,int(last_page)+1):
url = img_src[0:url_len-4-len(str(i))]+str(i)+".jpg"
file_path = "Downloads\\"+url.split('/')[-1]
r = requests.get(url, stream=True)
with open(file_path, "wb") as code:
for chunk in r.iter_content(chunk_size=32):
code.write(chunk)
print('Saved %s , total:%s ' %(file_path,last_page))